# Contributor: Joseph Benden <joe@benden.us>
# Maintainer: psykose <alice@ayaya.dev>
pkgname=thunderbird
pkgver=102.0.2
pkgrel=0
pkgdesc="Thunderbird email client"
url="https://www.thunderbird.net/"
# Limited on:
# armhf: build failure on armhf due to wasm
# s390x and riscv64: limited by rust and cargo
# s390x: limited by pipewire
arch="all !armhf !s390x !riscv64"
license="GPL-3.0-or-later AND LGPL-2.1-or-later AND MPL-2.0"
options="!check"
depends="ffmpeg-libs"
makedepends="
	alsa-lib-dev
	automake
	botan-dev
	bsd-compat-headers
	cargo
	cbindgen
	clang-dev
	dbus-glib-dev
	gettext
	gtk+3.0-dev
	hunspell-dev
	icu-dev
	json-c-dev
	libevent-dev
	libffi-dev
	libidl-dev
	libjpeg-turbo-dev
	libnotify-dev
	libogg-dev
	libtheora-dev
	libtool
	libvorbis-dev
	libvpx-dev
	libwebp-dev
	libxcomposite-dev
	libxt-dev
	lld
	llvm-dev
	m4
	mesa-dev
	nasm
	nodejs
	nspr-dev
	nss-dev
	nss-static
	openmp-dev
	pipewire-dev
	pulseaudio-dev
	py3-psutil
	py3-zstandard
	python3
	sed
	wasi-sdk
	wireless-tools-dev
	yasm
	zip
	"
source="https://ftp.mozilla.org/pub/thunderbird/releases/$pkgver/source/thunderbird-$pkgver.source.tar.xz
	stab.h

	fix-fortify-system-wrappers.patch
	mallinfo.patch

	disable-moz-stackwalk.patch
	fix-rust-target.patch
	fix-webrtc-glibcisms.patch
	allow-custom-rust-vendor.patch

	sandbox-fork.patch
	sandbox-sched_setscheduler.patch
	sandbox-largefile.patch

	avoid-redefinition.patch
	cbindgen-0.24.patch
	psutil.patch
	zstandard.patch
	metainfo.patch

	distribution.ini
	thunderbird.desktop
	vendor-prefs.js
	"

# secfixes:
#   102.0-r0:
#     - CVE-2022-2200
#     - CVE-2022-2226
#     - CVE-2022-31744
#     - CVE-2022-34468
#     - CVE-2022-34470
#     - CVE-2022-34472
#     - CVE-2022-34478
#     - CVE-2022-34479
#     - CVE-2022-34481
#     - CVE-2022-34484
#   91.10.0-r0:
#     - CVE-2022-1834
#     - CVE-2022-31736
#     - CVE-2022-31737
#     - CVE-2022-31738
#     - CVE-2022-31739
#     - CVE-2022-31740
#     - CVE-2022-31741
#     - CVE-2022-31742
#     - CVE-2022-31747
#   91.9.1-r0:
#     - CVE-2022-1529
#     - CVE-2022-1802
#   91.9.0-r0:
#     - CVE-2022-1520
#     - CVE-2022-29909
#     - CVE-2022-29911
#     - CVE-2022-29912
#     - CVE-2022-29913
#     - CVE-2022-29914
#     - CVE-2022-29916
#     - CVE-2022-29917
#   91.8.0-r0:
#     - CVE-2022-1097
#     - CVE-2022-1196
#     - CVE-2022-1197
#     - CVE-2022-24713
#     - CVE-2022-28281
#     - CVE-2022-28282
#     - CVE-2022-28285
#     - CVE-2022-28286
#     - CVE-2022-28289
#   91.7.0-r0:
#     - CVE-2022-26381
#     - CVE-2022-26383
#     - CVE-2022-26384
#     - CVE-2022-26386
#     - CVE-2022-26388
#   91.6.2-r0:
#     - CVE-2022-0566
#     - CVE-2022-26485
#     - CVE-2022-26486
#   91.6.0-r0:
#     - CVE-2022-22753
#     - CVE-2022-22754
#     - CVE-2022-22756
#     - CVE-2022-22759
#     - CVE-2022-22760
#     - CVE-2022-22761
#     - CVE-2022-22763
#     - CVE-2022-22764
#   91.5.0-r0:
#     - CVE-2021-4140
#     - CVE-2022-22737
#     - CVE-2022-22738
#     - CVE-2022-22739
#     - CVE-2022-22740
#     - CVE-2022-22741
#     - CVE-2022-22742
#     - CVE-2022-22743
#     - CVE-2022-22744
#     - CVE-2022-22745
#     - CVE-2022-22746
#     - CVE-2022-22747
#     - CVE-2022-22748
#     - CVE-2022-22751
#   91.4.1-r0:
#     - CVE-2021-4126
#     - CVE-2021-44538
#   91.4.0-r0:
#     - CVE-2021-4129
#     - CVE-2021-43528
#     - CVE-2021-43536
#     - CVE-2021-43537
#     - CVE-2021-43538
#     - CVE-2021-43539
#     - CVE-2021-43541
#     - CVE-2021-43542
#     - CVE-2021-43543
#     - CVE-2021-43545
#     - CVE-2021-43546
#   91.3.2-r0:
#     - CVE-2021-23961
#     - CVE-2021-23994
#     - CVE-2021-23995
#     - CVE-2021-23998
#     - CVE-2021-23999
#     - CVE-2021-24002
#     - CVE-2021-29945
#     - CVE-2021-29946
#     - CVE-2021-29948
#     - CVE-2021-29951
#     - CVE-2021-29956
#     - CVE-2021-29957
#     - CVE-2021-29964
#     - CVE-2021-29967
#     - CVE-2021-29969
#     - CVE-2021-29970
#     - CVE-2021-29976
#     - CVE-2021-29980
#     - CVE-2021-29980
#     - CVE-2021-29981
#     - CVE-2021-29982
#     - CVE-2021-29984
#     - CVE-2021-29985
#     - CVE-2021-29986
#     - CVE-2021-29987
#     - CVE-2021-29988
#     - CVE-2021-29989
#     - CVE-2021-29991
#     - CVE-2021-30547
#     - CVE-2021-32810
#     - CVE-2021-38492
#     - CVE-2021-38493
#     - CVE-2021-38495
#     - CVE-2021-38496
#     - CVE-2021-38497
#     - CVE-2021-38498
#     - CVE-2021-38500
#     - CVE-2021-38501
#     - CVE-2021-38502
#     - CVE-2021-38503
#     - CVE-2021-38504
#     - CVE-2021-38505
#     - CVE-2021-38506
#     - CVE-2021-38507
#     - CVE-2021-38508
#     - CVE-2021-38509
#     - CVE-2021-38510
#     - CVE-2021-43534
#     - CVE-2021-43535
#   78.9.0-r0:
#     - CVE-2021-23968
#     - CVE-2021-23969
#     - CVE-2021-23973
#     - CVE-2021-23978
#     - CVE-2021-23981
#     - CVE-2021-23982
#     - CVE-2021-23984
#     - CVE-2021-23987
#   78.7.0-r0:
#     - CVE-2020-15685
#     - CVE-2020-26976
#     - CVE-2021-23953
#     - CVE-2021-23954
#     - CVE-2021-23960
#     - CVE-2021-23964
#   78.6.1-r0:
#     - CVE-2020-16044
#     - CVE-2020-16042
#     - CVE-2020-26971
#     - CVE-2020-26973
#     - CVE-2020-26974
#     - CVE-2020-26978
#     - CVE-2020-35111
#     - CVE-2020-35112
#     - CVE-2020-35113
#   78.5.1-r0:
#     - CVE-2020-15683
#     - CVE-2020-15969
#     - CVE-2020-15999
#     - CVE-2020-16012
#     - CVE-2020-26950
#     - CVE-2020-26951
#     - CVE-2020-26953
#     - CVE-2020-26956
#     - CVE-2020-26958
#     - CVE-2020-26959
#     - CVE-2020-26960
#     - CVE-2020-26961
#     - CVE-2020-26965
#     - CVE-2020-26966
#     - CVE-2020-26968
#     - CVE-2020-26970
#   68.10.0-r0:
#     - CVE-2020-12417
#     - CVE-2020-12418
#     - CVE-2020-12419
#     - CVE-2020-12420
#     - CVE-2020-12421
#   68.9.0-r0:
#     - CVE-2020-12398
#     - CVE-2020-12399
#     - CVE-2020-12405
#     - CVE-2020-12406
#     - CVE-2020-12410
#   68.8.0-r0:
#     - CVE-2020-12387
#     - CVE-2020-12392
#     - CVE-2020-12393
#     - CVE-2020-12395
#     - CVE-2020-12397
#     - CVE-2020-6831
#   68.7.0-r0:
#     - CVE-2020-6819
#     - CVE-2020-6820
#     - CVE-2020-6821
#     - CVE-2020-6822
#     - CVE-2020-6825
#   68.6.0-r0:
#     - CVE-2019-20503
#     - CVE-2020-6805
#     - CVE-2020-6806
#     - CVE-2020-6807
#     - CVE-2020-6811
#     - CVE-2020-6812
#     - CVE-2020-6814
#   68.5.0-r0:
#     - CVE-2020-6793
#     - CVE-2020-6794
#     - CVE-2020-6795
#     - CVE-2020-6797
#     - CVE-2020-6798
#     - CVE-2020-6792
#     - CVE-2020-6800

_mozappdir=/usr/lib/thunderbird

# help our shared-object scanner to find the libs
ldpath="$_mozappdir"
sonameprefix="$pkgname:"

# these keys are for alpine use only.
# please don't use these keys outside of Alpine Linux
# you can create your own at:
# http://www.chromium.org/developers/how-tos/api-keys
# https://location.services.mozilla.com/api
_google_api_key="AIzaSyCRI4EGpDu_AAHI8E2yenjVhWQdp4G8igc"
# _mozilla_api_key="" TODO: get one

# we need this because cargo verifies checksums of all files in vendor
# crates when it builds and gives us no way to override or update the
# file sanely... so just clear out the file list
_clear_vendor_checksums() {
	sed -i 's/\("files":{\)[^}]*/\1/' third_party/rust/$1/.cargo-checksum.json
}

prepare() {
	default_prepare
	cp "$srcdir"/stab.h toolkit/crashreporter/google-breakpad/src/

	_clear_vendor_checksums audio_thread_priority
	_clear_vendor_checksums target-lexicon-0.9.0

	printf "%s" "$_google_api_key" >google-api-key
	# printf "%s" "$_mozilla_api_key" >mozilla-api-key
}

build() {
	export SHELL=/bin/sh
	export BUILD_OFFICIAL=1
	export MOZILLA_OFFICIAL=1
	export USE_SHORT_LIBNAME=1
	export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
	export MOZBUILD_STATE_PATH="$srcdir"/mozbuild
	export MOZ_BUILD_DATE=$(date --date "@$SOURCE_DATE_EPOCH" "+%Y%m%d%H%M%S")
	# Find our triplet JSON
	export RUST_TARGET="$CTARGET"
	# Build with Clang, takes less RAM
	export CC="clang"
	export CXX="clang++"

	# set rpath so linker finds the libs
	export LDFLAGS="$LDFLAGS -Wl,-rpath,$_mozappdir"

	case "$CARCH" in
	arm*|x86*)
		# disable-elf-hack: exists only on arm, x86, x86_64
		_arch_config="--disable-elf-hack"
		;;
	esac

	# webrtc does not build on these
	case "$CARCH" in
	armv7|ppc64le)
		_webrtc_config="--disable-webrtc"
		;;
	esac

	# FF doesn't have SIMD available on these arches.
	case "$CARCH" in
	armhf|armv7)
		_rust_simd="--disable-rust-simd"
		_low_mem_flags="--disable-debug-symbols --disable-debug"
		export RUSTFLAGS="$RUSTFLAGS -C debuginfo=0"
		;;
	x86)
		_low_mem_flags="--disable-debug-symbols --disable-debug"
		export RUSTFLAGS="$RUSTFLAGS -C debuginfo=0"
		;;
	*)
		_rust_simd="--enable-rust-simd"
		;;
	esac

	./mach configure \
		--prefix=/usr \
		$_arch_config \
		$_low_mem_flags \
		$_rust_simd \
		$_webrtc_config \
		\
		--disable-crashreporter \
		--disable-install-strip \
		--disable-jemalloc \
		--disable-profiling \
		--disable-strip \
		--disable-tests \
		--disable-updater \
		\
		--enable-alsa \
		--enable-application=comm/mail \
		--enable-dbus \
		--enable-default-toolkit=cairo-gtk3-wayland \
		--enable-ffmpeg \
		--enable-hardening \
		--enable-linker=lld \
		--enable-necko-wifi \
		--enable-official-branding \
		--enable-optimize="$CFLAGS -O2" \
		--enable-pulseaudio \
		--enable-release \
		--enable-system-ffi \
		--enable-system-pixman \
		\
		--with-google-location-service-api-keyfile="$builddir"/google-api-key \
		--with-google-safebrowsing-api-keyfile="$builddir"/google-api-key \
		--with-system-botan \
		--with-system-ffi \
		--with-system-icu \
		--with-system-jpeg \
		--with-system-jsonc \
		--with-system-libevent \
		--with-system-libvpx \
		--with-system-nspr \
		--with-system-nss \
		--with-system-pixman \
		--with-system-webp \
		--with-system-zlib \
		--with-distribution-id=org.alpinelinux \
		--with-libclang-path=/usr/lib \
		\
		--with-unsigned-addon-scopes=app,system \
		--allow-addon-sideload \
		--with-wasi-sysroot=/usr/share/wasi-sysroot
		# --with-system-png  # no apng
		# --with-mozilla-api-keyfile="$builddir"/mozilla-api-key
	./mach build
}

package() {
	DESTDIR="$pkgdir" ./mach install

	local _png
	for _png in "$builddir"/comm/mail/branding/thunderbird/default*.png; do
		local i=${_png%.png}
		i=${i##*/default}
		install -Dm644 "$_png" "$pkgdir"/usr/share/icons/hicolor/"$i"x"$i"/apps/thunderbird.png
	done

	install -Dm644 "$builddir"/comm/mail/branding/thunderbird/TB-symbolic.svg \
		"$pkgdir"/usr/share/icons/hicolor/symbolic/apps/thunderbird-symbolic.svg

	install -Dm644 "$builddir"/comm/mail/branding/thunderbird/net.thunderbird.Thunderbird.appdata.xml \
		-t "$pkgdir"/usr/share/metainfo

	install -Dm644 "$srcdir"/thunderbird.desktop \
		-t "$pkgdir"/usr/share/applications

	install -Dm644 "$srcdir"/vendor-prefs.js \
		-t "$pkgdir"/$_mozappdir/defaults/pref
	install -Dm644 "$srcdir"/distribution.ini \
		-t "$pkgdir"/$_mozappdir/distribution

	# Use system-provided dictionaries
	ln -Tsfv /usr/share/hunspell "$pkgdir"/usr/lib/$pkgname/dictionaries
	ln -Tsfv /usr/share/hyphen "$pkgdir"/usr/lib/$pkgname/hyphenation

	# Replace duplicate binary with wrapper
	# https://bugzilla.mozilla.org/show_bug.cgi?id=658850
	install -Dm755 /dev/stdin "$pkgdir"/usr/bin/thunderbird <<- EOF
	#!/bin/sh
	exec /usr/lib/$pkgname/thunderbird "\$@"
	EOF
	rm "$pkgdir"/$_mozappdir/thunderbird-bin
	ln -sfv /usr/bin/thunderbird "$pkgdir"/$_mozappdir/thunderbird-bin
}

sha512sums="
c757543aff8b0acc48f1e2d5fb94024fa894a34f27275eb9c9193d8d2c6aee7643d8b762e7b511c2217130a93ffb0d5e7a405b2bfb15ea129b2a6f9ae9c7e9f2  thunderbird-102.0.2.source.tar.xz
0b3f1e4b9fdc868e4738b5c81fd6c6128ce8885b260affcb9a65ff9d164d7232626ce1291aaea70132b3e3124f5e13fef4d39326b8e7173e362a823722a85127  stab.h
2f4f15974d52de4bb273b62a332d13620945d284bbc6fe6bd0a1f58ff7388443bc1d3bf9c82cc31a8527aad92b0cd3a1bc41d0af5e1800e0dcbd7033e58ffd71  fix-fortify-system-wrappers.patch
a4a3e062661bda64d502d426c480ac9645345860118de9df9ffe6e0597738c70c11e5cdef2d4fd12c5e2ee30a09310159230524655a419a4f7e4eeeb0f3c06b0  mallinfo.patch
454ea3263cabce099accbdc47aaf83be26a19f8b5a4568c01a7ef0384601cf8315efd86cd917f9c8bf419c2c845db89a905f3ff9a8eb0c8e41042e93aa96a85c  disable-moz-stackwalk.patch
cd68b89e29e5f6379fbd5679db27b9a5ef70ea65e51c0d0a8137e1f1fd210e35a8cfb047798e9549bc7275606d7ec5c8d8af1335d29da4699db7acd8bc7ff556  fix-rust-target.patch
305c874fdea3096e9c4c6aa6520ac64bb1c347c4b59db8360096646593fe684c3b5377874d91cecd33d56d1410b4714fbdea2b514923723ecbeff79d51265d9b  fix-webrtc-glibcisms.patch
4e584621145cf8add069c6dac18e805b3274a1ee402d84e924df2341f7d3c5be261a93ef51283bacbd606f47fbdc628c4323ecc31efc5b403b8d224b18dc278f  allow-custom-rust-vendor.patch
2518f2fc75b5db30058e0735f47d60fdf1e7adfaeee4b33fb2afb1bd9a616ce943fd88f4404d0802d4083703f4acf1d5ad42377218d025bc768807fbaf7e1609  sandbox-fork.patch
94433c5ffdbe579c456d95c5f053f61fcbab2f652fa90bc69dcc27d9a1507a8e5c677adeadae9a7a75cc9a55184c1040737f4dfd10b279c088ef016561e6f135  sandbox-sched_setscheduler.patch
b7d0a6126bdf6c0569f80aabf5b37ed2c7a35712eb8a0404a2d85381552f5555d4f97d213ea26cec6a45dc2785f22439376ed5f8e78b4fd664ef0223307b333e  sandbox-largefile.patch
b1cb2db3122634f66d2bae7066e76f2dcd455c464e021db4de3b0a08314df95cb667846081682db549dd2af8a00831cabe44a2420c66cdfb5e3b5fa7e6bd21d3  avoid-redefinition.patch
3526402ccae1f0428f2e45bae8d0b2cb909ac2698bc3508b692b827839ccb21203ce414206039776f6ce946fc53e636290b7870e9886284d5e9d1e8ad050aac9  cbindgen-0.24.patch
ccccaa44aad0b110804f6630ea726df0c0785c4e4a021a2778ce3c5b0265a5c11524c54f89996d8ff343661538e9eef5008c1185d2ee63a0736e276d942e711a  psutil.patch
c9bf4055f17f3500d7fd51417b745319629284814d971d30e78cbf06ab0d87aaf09ae2733173eee09bcd54aec2cd48ca99477a1b46d8bb7bfac1521e72661f33  zstandard.patch
79948c0670e4ff1d9dac3b11b64937e58fb73dd9ea405cbebc6777ec96243ac3d8ac820b2ac67c1b39aaa286267da156b00ff28abc40a5071e189637046b9834  metainfo.patch
3d1f85c2cd446a973cf158caada7fbc32cbc890ec5111d6d2ac98862df11d0c80cc52eaec290721c64034be7398ed68a91405f168e13ca71ff1981f51cb60046  distribution.ini
745e7b09f8500e804112ff2837cb381d2f11aa76f214d1fdb20f467c8481d43411e19037af7744b63203e6d280d43488be6ef6ff8711019ca19961cde2e7ea15  thunderbird.desktop
d48e2a328fd756e082e7ccd1b3156b5066b4526c2647fafad9d22189b3413d6a564a4d0b03b37a9670c53d65b5ba4a7af855a7a4a4583e4228ee66510bdb379d  vendor-prefs.js
"
